package com.lmx.project.untils;

import com.lmx.project.common.ErrorCode;
import com.lmx.project.exception.BusinessException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import javax.annotation.Resource;
import java.io.*;
import java.util.Date;
import java.util.List;
import java.util.UUID;

@Component
public class FileUtil {


    @Value("${myfile.pre}")
    private String pre;

//    @Value("${myfile.preurl}")
//    private String preurl;

    @Resource
    private FileUtilAsync fileUtilAsync;


    /**
     * 将输入流保存到指定路径的文件中
     *
     * @param inputStream 输入流
     * @param path        文件保存的路径，包括文件名
     * @throws IOException 如果写入文件时发生I/O错误，则会抛出IOException
     */


//    /**
//     * 移动文件
//     */
//    @Async
//    public void moveFile(String oldpath, String newpath) throws IOException {
//        String realoldpath = pre + oldpath;
//        String realnewpath = pre + newpath;
//
//        File oldfile = new File(realoldpath);
//        File newfile = new File(realnewpath);
//        if (!oldfile.exists() || !newfile.exists()) {
//            return;
//        }
//// 移动文件
//        BufferedInputStream bis = new BufferedInputStream(new FileInputStream(oldfile));
//
//        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(newfile));
//
//        byte[] bytes = new byte[1024];
//        int length = 0;
//
//        while ((length = bis.read(bytes)) != -1) {
//            bos.write(bytes, 0, length);
//        }
////        删除旧文件
//        fileUtilAsync.removeFile(oldpath);
//        bos.close();
//        bis.close();
//        System.out.println("移动文件成功");
//    }


    /**
     * 获取随机的文件名字
     */
    public String getFilename(MultipartFile image) {
        //                获取文件后缀
        String originalFilename = image.getOriginalFilename();

        String prefix = originalFilename.substring(originalFilename.lastIndexOf(".")); //后缀
//                获取当前的时间
        Date date = new Date();
        long time = date.getTime();

        String pre = UUID.randomUUID().toString().replace("-", "") + time;

        String filename = pre + prefix;

        return filename;
    }

    /**
     * 获取文件前缀
     */
    public String getPre() {
        return pre;
    }

    public void saveFileFromInputStream(InputStream inputStream, String path) throws IOException {
        //            byte[] bytes = file.getBytes();
        //压缩图片到指定120K以内,不管你的图片有多少兆,都不会超过120kb,精度还算可以,不会模糊
//        压缩图片
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        byte[] bufferome = new byte[1024 * 4];
        int n = 0;
        while (-1 != (n = inputStream.read(bufferome))) {
            output.write(bufferome, 0, n);
        }
//         实现图片压缩
        byte[] bytes = PicUtils.compressPicForScale(output.toByteArray(), 600);
        inputStream = new ByteArrayInputStream(bytes);
//        读取文件
        File file = new File(pre + path);
        System.out.println(file.getParentFile());
        if (file.getParentFile() != null && !file.getParentFile().exists()) {
            file.getParentFile().mkdirs();
        }
        FileOutputStream outputStream = new FileOutputStream(file);
        byte[] buffer = new byte[1024];
        int len;
        while ((len = inputStream.read(buffer)) > 0) {
            outputStream.write(buffer, 0, len);
        }
        outputStream.close();
        inputStream.close();

        fileUtilAsync.uploadNetwork(path, file);
    }

    /**
     * 删除文件列表
     */

    /**
     * 删除单个人间
     * */
    public void removeFile(String path){
        fileUtilAsync.removeFile(path);
    }

    public void removeFileList(List<String> collect) {
        for (String s : collect) {
            fileUtilAsync.removeFile(s);
        }
    }

    /**
     * 判断是否是图片,jpg/png图片
     */
    public boolean isImage(InputStream inputStream) throws IOException {
//        FileInputStream inputStream = new FileInputStream(file);
        // 读取前两个字节，一个图片文件的前两个固定字节是特定的
        byte[] header = new byte[2];
        inputStream.read(header);

        // 检查是否是图片文件
        if (header[0] == (byte) 0xFF && header[1] == (byte) 0xD8) {
            return true; // JPEG文件
        } else if (header[0] == (byte) 0x89 && header[1] == (byte) 0x50) {
            return true; // PNG文件
        }
//        else if (header[0] == (byte) 0x47 && header[1] == (byte) 0x49) {
//            return true; // GIF文件
//        } else if (header[0] == (byte) 0x42 && header[1] == (byte) 0x4D) {
//            return true; // BMP文件
//        }
        else {
            return false; // 不是图片文件
        }
    }

    /**
     * 判断是否是视频文件
     */
    public boolean isVideo(InputStream inputStream) throws IOException {

        // 读取文件头的前四个字节，判断是否为视频文件格式
        byte[] header = new byte[4];
        inputStream.read(header);

        String fileHeader = bytesToHex(header); // 将字节数组转换为十六进制字符串

        // 检查是否为以下视频文件格式
        if (fileHeader.contains("0001BA")) {
            return true; // MPEG文件
        } else if (fileHeader.contains("3026B2")) {
            return true; // ASF文件
        } else if (fileHeader.contains("52494646")) {
            byte[] riffType = new byte[4];
            inputStream.read(riffType);
            String riffTypeStr = bytesToHex(riffType);
            if (riffTypeStr.contains("5741")) {
                return true; // AVI文件
            } else if (riffTypeStr.contains("7776")) {
                return true; // WAV文件
            }
        } else if (fileHeader.contains("66747970")) {
            inputStream.skip(21);
            byte[] dataType = new byte[4];
            inputStream.read(dataType);
            String dataTypeStr = bytesToHex(dataType);
            if (dataTypeStr.contains("6D7034")) {
                return true; // MP4文件
            }
        }

        return false;
    }


    /**
     * 使用文件名判断是否是视频文件
     */
    public boolean isVideoFileByFilename(String fileName) {
        String[] videoExtensions = {".mp4", ".avi", ".mov", ".mkv", ".flv", ".wmv", ".mpeg"};
        for (String extension : videoExtensions) {
            if (fileName.endsWith(extension)) {
                return true;
            }
        }
        return false;
    }

    private String bytesToHex(byte[] bytes) {
        StringBuilder hexBuilder = new StringBuilder();
        for (byte b : bytes) {
            hexBuilder.append(String.format("%02X", b));
        }
        return hexBuilder.toString();
    }

    /**
     * 保存MultipartFile类型的文件
     */

    public String saveMultipartFile(MultipartFile file, String dir) {
        try {
            //                判断是否是图片
            InputStream inputStream = file.getInputStream();

            String filename = this.getFilename(file);
            String realpath = dir + filename;
//            System.out.println("开始异步——————————");
            saveFileFromInputStream(inputStream, realpath);
//            System.out.println("结束——————————");
            return realpath;
        } catch (IOException e) {
            e.printStackTrace();
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "文件上传异常");
        }
    }

    public String saveMultipartFile(MultipartFile file, String dir,String fileName) {
        try {
            //                判断是否是图片
            InputStream inputStream = file.getInputStream();

//            String filename = this.getFilename(file);
            String realpath = dir + fileName;
//            System.out.println("开始异步——————————");
            saveFileFromInputStream(inputStream, realpath);
//            System.out.println("结束——————————");
            return realpath;
        } catch (IOException e) {
            e.printStackTrace();
            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "文件上传异常");
        }
    }

    /**
     * 获取资源的url路径
     */
    public String getPreUrl() {

        return fileUtilAsync.getPreUrl();

    }


//    /**
//     * 将输入流保存到指定路径的文件中
//     *
//     * @param inputStream 输入流
//     * @param path        文件保存的路径，包括文件名
//     * @throws IOException 如果写入文件时发生I/O错误，则会抛出IOException
//     */
//
//    public void saveFileFromInputStream(InputStream inputStream, String path) throws IOException {
//        //            byte[] bytes = file.getBytes();
//        //压缩图片到指定120K以内,不管你的图片有多少兆,都不会超过120kb,精度还算可以,不会模糊
////        压缩图片
//        ByteArrayOutputStream output = new ByteArrayOutputStream();
//        byte[] bufferome = new byte[1024 * 4];
//        int n = 0;
//        while (-1 != (n = inputStream.read(bufferome))) {
//            output.write(bufferome, 0, n);
//        }
//        byte[] bytes = PicUtils.compressPicForScale(output.toByteArray(), 600);
//        inputStream = new ByteArrayInputStream(bytes);
////        读取文件
//        File file = new File(pre + path);
//        System.out.println(file.getParentFile());
//        if (file.getParentFile() != null && !file.getParentFile().exists()) {
//            file.getParentFile().mkdirs();
//        }
//        FileOutputStream outputStream = new FileOutputStream(file);
//        byte[] buffer = new byte[1024];
//        int len;
//        while ((len = inputStream.read(buffer)) > 0) {
//            outputStream.write(buffer, 0, len);
//        }
//        outputStream.close();
//        inputStream.close();
//        System.out.println("保存文件成功：" + path);
//    }
//
//
//    /**
//     * 删除文件
//     */
//
//    public void removeFile(String path) {
//        String realpath = pre + path;
//        System.out.println(realpath);
//        File file = new File(realpath);
//
////     如果存在，删除它
//        boolean delete = file.delete();
//        if (!delete) {
//            throw new BusinessException(ErrorCode.SYSTEM_ERROR, "图片删除失败，请重试");
//        }
//
//    }
//
//    /**
//     * 保存文件，绝对路径
//     */
//
//    public void saveFile(InputStream inputStream, String absolutePath) throws IOException {
//        absolutePath=pre+absolutePath;
//        System.out.println(absolutePath+"开始保存");
//        File file = new File(absolutePath);
//
//        if (file.getParentFile() != null && !file.getParentFile().exists()) {
//            file.getParentFile().mkdirs();
//        }
//
//        FileOutputStream outputStream = new FileOutputStream(file);
//
//        byte[] buffer = new byte[1024];
//        int len;
//        while ((len = inputStream.read(buffer)) > 0) {
//            outputStream.write(buffer, 0, len);
//        }
//
//        inputStream.close();
//        outputStream.close();
//        System.out.println(absolutePath+"保存完毕");
//
//    }
//
//    public String getPre() {
//        return pre;
//    }
//

    public static void main(String[] args) throws IOException {
        FileInputStream fileInputStream = new FileInputStream("F:\\deskbook\\微信图片_20230314211014.jpeg");
        FileUtil fileUtil = new FileUtil();
        System.out.println(fileUtil.isImage(fileInputStream));
    }

}
